package com.ror.java.se.string;

/**
 * - intern 方法：手动把堆中串对象放入串池，已在池中的不放入，返回池中对象的引用。
 * - 用法：someStr.intern();
 * - JDK6及以前：复制堆中串对象到串池。串池在永久代，永久代空间有限，过多使用intern会导致OOM。
 * - JDK7起：串池仅存放串对象的引用。串池就在堆内存，不必重复创建对象，只需把引用纳入池中即可。
 */

public class Demo02Intern {
    public static void main(String[] args) {
        Test01_Join();
        System.out.println("==========================");
        Test02_NoJoin();
    }

    public static void Test01_Join() {
        String s1 = new String("a") + new String("b");
        System.out.print("Hashcode Before: ");
        System.out.println(s1.hashCode());
        String s2 = s1.intern(); // 池内没有"ab"，把s1的引用纳入池中
        System.out.print("Hashcode After: ");
        System.out.println(s1.hashCode());
        System.out.println(s1 == s2); // true
    }

    public static void Test02_NoJoin() {
        String s1 = "ab";
        String s2 = new String("a") + new String("b");
        String s3 = s2.intern(); // 池内已有"ab"(s1)，复用之，s2不动
        System.out.println(s2 == s3); // false，s3在池内，s2还在池外
        System.out.println(s1 == s3); // true，s3复用s1对象
    }
}
